#ifndef SP3_INTERPOLATOR_H
#define SP3_INTERPOLATOR_H

#include <string>
#include <vector>
#include <map>

/**
 * @class SP3Interpolator
 * @brief 精密星历文件(SP3)解析和插值类
 */
class SP3Interpolator {
public:
    SP3Interpolator();
    ~SP3Interpolator();
    
    /**
     * @brief 读取SP3文件
     * @param filename SP3文件路径
     * @return 是否成功读取
     */
    bool readSP3File(const std::string& filename);
    
    /**
     * @brief 设置插值阶数
     * @param order 插值阶数(建议4-10)
     */
    void setInterpolationOrder(int order) { interpOrder_ = order; }
    
    /**
     * @brief 获取卫星位置和速度
     * @param satId 卫星PRN标识
     * @param time GPS时间(秒)
     * @param pos 输出卫星位置[x,y,z,clk](m,m,m,s)
     * @param vel 输出卫星速度[vx,vy,vz,clkdrift](m/s,m/s,m/s,s/s)
     * @return 是否成功插值
     */
    bool getSatellitePosVel(const std::string& satId, double time, 
                           std::vector<double>& pos, std::vector<double>* vel = nullptr);

    std::vector<std::string> getAvailableSatellites() const;
    std::vector<std::string> getAvailableSatellites(const std::string& system) const;
    std::pair<double, double> getTimeRange() const;

private:
    /**
     * @struct SP3Data
     * @brief SP3数据结构
     */
    struct SP3Data {
        double time;                  // GPS时间(秒)
        std::vector<double> pos;      // 位置+钟差[x,y,z,clk](m,m,m,s)
        std::vector<double> vel;      // 速度+钟漂[vx,vy,vz,clkdrift](m/s,m/s,m/s,s/s)
    };
    
    std::map<std::string, std::vector<SP3Data>> sp3Data_;  // 卫星数据 [PRN][时间点]
    int interpOrder_;                                      // 插值阶数(通常4-10)
    
    /**
     * @brief 拉格朗日插值函数
     * @param time 时间点数组
     * @param data 数据数组[时间点][维度]
     * @param t 待插值时间点
     * @param result 输出插值结果[维度]
     */
    void lagrangeInterpolation(const std::vector<double>& time, 
                              const std::vector<std::vector<double>>& data,
                              double t, std::vector<double>& result);
    
    /**
     * @brief 拉格朗日插值导数
     * @param time 时间点数组
     * @param data 数据数组[时间点][维度]
     * @param t 待插值时间点
     * @param result 输出导数结果[维度]
     */
    void lagrangeInterpolationDerivative(const std::vector<double>& time, 
                                        const std::vector<std::vector<double>>& data,
                                        double t, std::vector<double>& result);
};

#endif // SP3_INTERPOLATOR_H 